/*!
 * 数据表格v1.0
 *
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 */
(function( $, undefined ) {
	$.widget( "grass.datagrid", {
		version: "1.0",
		defaultElement: "<div>",
		regional: {
			loadMsgText: '数据加载中。。。。。。',
			loadErrorMsgText: '获取数据失败'
		},
		options: {
			url: null,
			datas: null,
			columns: null,// datagrid 的 column 的配置对象。
			nowrap: true,// True 就会把数据显示在一行里。 
			method: "post",// 请求远程数据的 method 类型。
			loadMsg: null,// 当从远程站点加载数据时，显示的提示信息。
			pagination: true,// True 就会在 datagrid 的底部显示分页栏。
			rownumbers: true,// True 就会显示行号的列。
			pageList: [10,20,30,40,50],// 当设置了 pagination 特性时，初始化页面尺寸的选择列表。
			pageSize: 10,// 当设置了 pagination 特性时，初始化页码尺寸。
			pageNumber: 1,// 当设置了 pagination 特性时，初始化页码。
			queryParams: null,// 当请求远程数据时，发送的额外参数。
			mapping:{
				resultList: "resultList",
				currentPage: "currentPage",
				pageCount: "pageCount",
				pageSize: "pageSize",
				total: "total"
			}
		},
	
		_create: function() {
			if(!this.options.loadMsg){
				this.options.loadMsg = $.grass.datagrid.prototype.regional.loadMsgText;
			}
			this.table = $("<table>").addClass("table table-striped table-bordered");
			this.table.appendTo(this.element);
			// 创建thead
			this.thead =  $("<thead>").appendTo(this.table);
			// 创建tbody
			this.tbody =  $("<tbody>").appendTo(this.table);
			if(this.options.columns ==  null ||  typeof this.options.columns != "object"){
				$.error("请指定正确的columns属性");
				return false;
			}
			this._createTheads();
			
			if(this.options.pagination){
				this.pagination = this.element.pagination({
					pageSize: this.options.pageSize,
					pageNumber: this.options.pageNumber,
					onPageClick: function(pageNumber, pageSize){
						self.options.pageNumber = pageNumber;
						self.options.pageSize = pageSize;
						self.render();
					}
				});
			}
			this.render();
			
			
		},
		
		render: function(){
			if(this.options.datas){
				this._clearTbody();
				this.element.pagination("setTotal", this.options.datas.length);
				this.element.pagination("goToPage", parseInt(this.options.pageNumber, 10));
				this._appendTbodys(this._pageList());
			}else{
				// 请求数据
				this._requestDatas(function(success, datas){
					if(success){
						if(datas !=  null &&  typeof this.options.columns == "object"){
							this._clearTbody();
							if(this.options.pagination){
								this.element.pagination("setTotal", datas[this.options.mapping.total]);
								this.element.pagination("goToPage", parseInt(this.options.pageNumber, 10));
								this._appendTbodys(datas[this.options.mapping.resultList]);
							} else {
								this._appendTbodys(datas);
							}
						}
					}else{
						this._showMsg(datas);
					}
				});
			}
			
		},
	
		_requestDatas: function(fn){
			var self = this;
			this.showLoadMsg();
			var data = this.options.queryParams;
			if(this.options.pagination){
				data = $.extend({
					currentPage: this.options.pageNumber,
					pageSize: this.options.pageSize
				},this.options.queryParams);
			}
			$.ajax({
				url: this.options.url,
				type: this.options.method,
				data: data,
				cache: false,
				dataType: "json",
				success: function(datas){
					fn.call(self, true, datas);
				},
				error: function(e){
					fn.call(self, false,$.grass.datagrid.prototype.regional.loadErrorMsgText);
				}
			});
		},
		
		_createPager: function(){
			
		},
		
		_createTheads: function(){
			var self = this;
			var tr = $("<tr>").appendTo(this.thead);
			$.each(self.options.columns, function(k, v){
				if(!v.hidden){
					tr.append("<th title=\""+v.title+"\" style=\""+v.titleStyle+"\">"+v.title+"</th>");
				}
			});
		},
		
		_appendTbodys: function(datas){
			var self = this;
			var tr = null;
			$.each(datas, function(k, v){
				tr = $("<tr>").appendTo(self.tbody);
				$.each(self.options.columns, function(k1, v1){
					if(!v1.hidden){
						if(v1.fomatter){
							$("<td>"+v1.fomatter(v[v1.field], datas[k], k)+"</td>")
								.attr("style", v.style).appendTo(tr);
						}else{
							$("<td title=\""+v[v1.field]+"\">"+v[v1.field]+"</td>")
								.attr("style", v.style).appendTo(tr);
						}
					}
					
					
				});
			});
		},
		
		_clearTbody: function(){
			this.tbody.empty();
		},
		
		_showMsg: function(msg){
			this._clearTbody();
			var tr = $("<tr>").appendTo(this.tbody);
			tr.append("<td colspan=\""+this.options.columns.length+"\">"+msg+"</td>");
		},
		
		showLoadMsg: function(){
			this._showMsg(this.options.loadMsg);
		},
		_pageList: function(){
			var resultList = [];
			var start = (this.options.pageNumber - 1) * this.options.pageSize;
			var end = this.options.pageNumber * this.options.pageSize;
			if(end > this.options.datas.length){
				end = this.options.datas.length;
			}
			
			for(var i = start;
				i <  end; i++){
				resultList.push(this.options.datas[i]);
			}
			return resultList;
		},
		destroy: function() {
			this.tbody.remove();
			this.thead.remove();
			this.table.remove();
		}
	});
	

}(jQuery));
